#!/system/bin/sh
#------------------------------------------------------------------------------
# <copyright file="makefile" company="Atheros">
#    Copyright (c) 2005-2010 Atheros Corporation.  All rights reserved.
# $ATH_LICENSE_HOSTSDK0_C$
#------------------------------------------------------------------------------
#==============================================================================
# Author(s): ="Atheros"
#==============================================================================
#Copyright (c) 2011 Freescale Semiconductor, Inc.
#==============================================================================
CLK_HELPER=0
WMODE="bg"
IFNAME=`getprop wifi.interface wlan0`
ARGS=`getprop wlan.driver.args "\"ifname=$IFNAME\""`
AP_IF_MODE="nat"
AP_SUBNET="192.168.11"
DNSMASQ_PID_FILE="/data/misc/wifi/hostapd/dnsmasq.pid"
HOSTAP_PID_FILE="/data/misc/wifi/hostapd/hostapd.pid"
HOSTAP_CONF_FILE="/data/misc/wifi/hostapd.conf"
TAGS="wlan_tool"
MODULE_CHECK="ls /sys/bus/sdio/drivers/ar6k_wlan"
WLAN_ENABLE_CHECK="echo 1"
DRIVER_PROP_NAME="wlan.driver.status"
APMODE_PROP_NAME="wlan.driver.apmode"
WIFI_STATUS="`getprop $DRIVER_PROP_NAME failed`"
BT_ENABLED="" # To be define
#SYSLOG="echo "
SYSLOG="log -p i -t $TAGS "

strcmp() {
    case $1 in
        $2)
        return 0;
        ;;
        *)
        return 1;
        ;;
    esac
}

wmode() {
    case $WMODE in
        bg)
        $SYSLOG "Running in 11bg mode"
        wmiconfig -i $IFNAME --wmode g
        wmiconfig -i $IFNAME --set_ht_cap g 0 0 1 1 0 1
        ;;
        ag)
        $SYSLOG "Running in 11ag mode"
        wmiconfig -i $IFNAME --wmode ag
        wmiconfig -i $IFNAME --set_ht_cap g 0 0 1 1 0 1
        wmiconfig -i $IFNAME --set_ht_cap a 0 1 1 1 0 1
        ;;
        *)
        $SYSLOG "Running in 11bgn mode"
        ;;
    esac
}

reload() {
    if ls $HOSTAP_PID_FILE; then
        kill -15 `cat $HOSTAP_PID_FILE`
        rm $HOSTAP_PID_FILE
    fi
    if $MODULE_CHECK; then
        rmmod ar6000
    fi
    $SYSLOG "Try to load driver with $@"
    if exp `getprop ro.build.version.sdk` == 8; then
        sleep 1
    fi
    insmod /system/lib/modules/ar6102.ko $@
    
    if exp $CLK_HELPER == 1; then
        if exp $BT_ENABLED == 1; then
            $SYSLOG "Setup bt on"
            wmiconfig -i $IFNAME --bt on
        else
            $SYSLOG "Setup bt off"
            wmiconfig -i $IFNAME --bt off
        fi
    fi
}

init() {
    setprop wifi.interface wlan0
    setprop $APMODE_PROP_NAME "unloaded"
    mkdir /data/misc/wifi/wpa_supplicant
    mkdir /data/misc/wifi/hostapd
    mkdir /data/system/wpa_supplicant /data/system/hostapd  
    chmod 770 /data/misc/wifi/wpa_supplicant /data/misc/wifi/hostapd
    chmod 770 /data/system/wpa_supplicant /data/system/hostapd
    chown wifi.wifi /data/misc/wifi/wpa_supplicant /data/misc/wifi/hostapd
    chown wifi.wifi /data/system/wpa_supplicant /data/system/hostapd
    chown system.system /sys/devices/platform/msm_sdcc.1/detect_change
    chown system.system /sys/devices/platform/msm_sdcc.2/detect_change
    mv /data/ar6k.log /data/ar6k.previous.log
    recEvent --logfile=/data/ar6k.log --binary --reclimit=10000&
    if exp $CLK_HELPER == 1; then
        reload $ARGS
        wmiconfig -i $IFNAME --wlan disable
    fi
}

checkapmode() {
    if strcmp `getprop $APMODE_PROP_NAME unloaded` "ok"; then
        return 0
    else 
        return 1
    fi
}

loadapdriver() {
    $SYSLOG "wifi loading ---------$ARGS------"
    if checkapmode; then
        $SYSLOG "Ap mode is running!"
        setprop $DRIVER_PROP_NAME "failed"
        return
    fi
    setprop $DRIVER_PROP_NAME ""
    if $MODULE_CHECK; then
        $SYSLOG "Driver is initialized. load it"
        wmiconfig -i wlap0 --wlan enable --allow_aggr 0x0 0x0
    else
        reload ifname=wlap0
    fi  
    WLAN_ENABLE_CHECK="wmiconfig -i wlap0 --getRTS"
    if $WLAN_ENABLE_CHECK; then
        $SYSLOG "ar6000 driver loaded"
        setprop $DRIVER_PROP_NAME "ok"
    else
        $SYSLOG "ar6000 driver fails to load"
        setprop $DRIVER_PROP_NAME "failed"
    fi
}

loaddriver() {
    $SYSLOG "wifi loading"
    if checkapmode; then
        $SYSLOG "Ap mode is running!"
        setprop $DRIVER_PROP_NAME "failed"
        return
    fi
    setprop $DRIVER_PROP_NAME ""
    if $MODULE_CHECK; then
        $SYSLOG "Driver is initialized. load it"
        wmiconfig -i $IFNAME --wlan enable
    else
        reload $ARGS
    fi   
    if $WLAN_ENABLE_CHECK; then
        $SYSLOG "ar6000 driver loaded"
        setprop $DRIVER_PROP_NAME "ok"
    else
        $SYSLOG "ar6000 driver fails to load"
        setprop $DRIVER_PROP_NAME "failed"
    fi
}

unloaddriver() {
    $SYSLOG "wifi unloading"
    if checkapmode; then
        $SYSLOG "Ap mode is running!"
        setprop $DRIVER_PROP_NAME "failed"
        return
    fi
    if exp $CLK_HELPER == 1; then
        wmiconfig -i $IFNAME --wlan disable        
    else
        rmmod ar6000
    fi

    sleep 1
    setprop $DRIVER_PROP_NAME "unloaded"
}

testmodeup() {
    setprop $DRIVER_PROP_NAME ""
    reload "testmode=1"
    if $WLAN_ENABLE_CHECK; then
        $SYSLOG "ar6000 driver loaded"
        setprop $DRIVER_PROP_NAME "ok"
    else
        $SYSLOG "ar6000 driver fails to load"
        setprop $DRIVER_PROP_NAME "failed"
    fi
}

testmodedown() {
    if $MODULE_CHECK; then
        rmmod ar6000
    fi
    if exp $CLK_HELPER == 1; then
        reload $ARGS
        wmiconfig -i $IFNAME --wlan disable
    fi
    setprop $DRIVER_PROP_NAME "unloaded"
}

apmodedown() {
    $SYSLOG "Shutting down Ap mode"
    if ls $HOSTAP_PID_FILE; then
        kill -15 `cat $HOSTAP_PID_FILE`
        rm -f $HOSTAP_PID_FILE

        case $AP_IF_MODE in
            nat)
# Reset NAT here 
            echo 0 > /proc/sys/net/ipv4/ip_forward 
            iptables --flush
# Stop dhcp server here
            kill -15 `cat $DNSMASQ_PID_FILE`
            rm $DNSMASQ_PID_FILE
            ifconfig $IFNAME 0.0.0.0 down
            ;;
            bridge)
            brctl delif br0 $IFNAME
            ;;
            *)
            $SYSLOG "Unknown ap mode"
            ;;
        esac

    fi
    iwconfig $IFNAME mode managed
    iwconfig $IFNAME essid off
    setprop $APMODE_PROP_NAME "unloaded"
    unloaddriver
}

apmodeup() {
    $SYSLOG "Running for AP mode"
    if strcmp $WIFI_STATUS "ok"; then
        $SYSLOG "Station mode is running. exit"
        return
    fi
    if checkapmode; then
        apmodedown
    fi
    if $MODULE_CHECK; then
        wmiconfig -i $IFNAME --wlan enable
    else
        reload $ARGS
        wmiconfig -i $IFNAME --connect dummy
    fi 
    
    if $WLAN_ENABLE_CHECK; then
# Execute hostapd here 
        if ls $HOSTAP_CONF_FILE; then
            /system/bin/hostapd -P $HOSTAP_PID_FILE -B $HOSTAP_CONF_FILE
        else
            $SYSLOG "Error! There is no $HOSTAP_CONF_FILE"
            apmodedown
            exit 255
        fi

# Setup NAT or bridge here
        case $AP_IF_MODE in
            nat)
            $SYSLOG "NAT mode Subnet $AP_SUBNET.255"
            echo 1 > /proc/sys/net/ipv4/ip_forward 
            iptables --flush
            iptables --table nat --flush
            iptables --delete-chain
            iptables --table nat --delete-chain
            iptables --append FORWARD --in-interface wlan0 -o rmnet0 -j ACCEPT
            iptables --table nat --append POSTROUTING --out-interface rmnet0 -j MASQUERADE
# Run dhcp server here
            ifconfig $IFNAME $AP_SUBNET.1 up
            dnsmasq -z -i $IFNAME -F $AP_SUBNET.100,$AP_SUBNET.200,12h
            ;;
            bridge)
            $SYSLOG "Bridge mode"
            ifconfig $IFNAME 0.0.0.0
            brctl addif br0 $IFNAME
            ;;
            *)
            $SYSLOG "Unknown ap mode"
            ;;
        esac

# Setup wlan.driver.status for GUI
        setprop $APMODE_PROP_NAME "ok"
    else
        $SYSLOG "ar6000 driver fails to load"
        apmodedown
    fi
}

if ! ls /system/bin/wmiconfig; then
    $SYSLOG "Cannot find wmiconfig!!!!"
fi 

case $1 in 
    dhcpcd)
    /system/bin/dhcpcd -B $IFNAME
    ;;
    wpa_supplicant)
    /system/bin/wpa_supplicant -Dar6000 -i$IFNAME -c/data/misc/wifi/wpa_supplicant.conf
    ;;
    hostapd)
    /system/bin/hostapd /data/misc/wifi/hostapd.conf
    ;;
    abtfilt)
    /system/bin/abtfilt -d -z -n -v
    ;;
    bton)
    if ! $MODULE_CHECK && exp $CLK_HELPER == 1; then
        $SYSLOG "Run BT clock helper"
        init
    fi
    setprop wlan.driver.btcoex ok
    ;;
    btoff)
    if ! strcmp $WIFI_STATUS "ok"; then
        if $MODULE_CHECK && exp $CLK_HELPER == 1; then
            $SYSLOG "Stop BT clock helper"
            rmmod ar6000
        fi
    fi
    setprop wlan.driver.btcoex ok
    ;;
    unload)    
    unloaddriver
    ;;
    load_ap)
    loadapdriver
    ;;
    load)
    loaddriver
    ;;
    testmodeup)
    testmodeup
    ;;
    testmodedown)
    testmodedown
    ;;
    apmodeup)
    apmodeup
    ;;
    apmodedown)
    apmodedown
    ;;
    *) 
    init
    ;;
esac
